package com.qf.arr;

import java.util.Random;
import java.util.Scanner;

/**
 * 数组相关的工具类
 */
public class ArrUtils {


    public static boolean arrIndex(String[] arr, String target) {

        for (int i = 0; i < arr.length; i++) {
            if (target.equals(arr[i])) return true;
        }

        return false;
    }


    /**
     * 折半查找
     *
     * @param arr    排序后数组
     * @param target 目标值
     * @return 目标值在数组中下标, 或者不存在返回-1
     */
    public static int halfSearch(int[] arr, int target) {
        int minIndex = 0;
        int maxIndex = arr.length - 1;

        while (minIndex <= maxIndex) {
            int middleIndex = (minIndex + maxIndex) / 2;
            if (target == arr[middleIndex]) {
                return middleIndex;
            } else if (target > arr[middleIndex]) {
                minIndex = middleIndex + 1;
            } else {
                maxIndex = middleIndex - 1;
            }
        }

        return -1;
    }

    /**
     * 选择排序
     *
     * @param arr
     */
    public static void selectSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            swap(arr[minIndex], arr[i]);
        }
    }


    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }

    /**
     * 冒泡排序
     *
     * @param arr
     * @return int[], 有可能是null
     */
    public static int[] bubbleSort(int[] arr) {
        if (arr.length < 1) return null;
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    /**
     * 判断是否重复
     *
     * @param arr  int[]
     * @param item int
     * @return boolean值
     */
    public static boolean isArrItemRepeat(int[] arr, int item) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == item) return true;
        }
        return false;
    }

    /**
     * @param range 随机数上限
     * @param size  随机数个数
     * @return 返回随机数数组
     */
    public static int[] randomArr(int range, int size) {
        Random r = new Random();
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            int random = r.nextInt(range) + 1;
            arr[i] = random;
        }

        return arr;
    }

    /**
     * 给定一个数组，求数组的平均值
     *
     * @param arr int[]
     * @return 平均数 float
     */
    public static double arrAverage(int[] arr) {
        float sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }

        return sum / arr.length;
    }

    /**
     * 给定一个数组，求数组的最小值
     *
     * @param arr int[]
     * @return 返回最小值 int
     */
    public static int arrMin(int[] arr) {
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            min = min < arr[i] ? min : arr[i];
        }

        return min;
    }

    /**
     * 返回数组最大值
     *
     * @param arr
     * @return
     */
    public static int arrMax(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            max = max > arr[i] ? max : arr[i];
        }

        return max;
    }

    /**
     * 接收名字
     *
     * @param size
     * @return 返回包含所有名字的数组
     */
    public static String[] acceptName(int size) {
        String[] arr = new String[size];
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < size; i++) {
            System.out.println("请输入" + (i + 1) + "个名字");
            arr[i] = sc.next();
        }

        return arr;
    }

    /**
     * 打印int数组
     *
     * @param arr
     */
    public static void printArr(int[] arr) {
        System.out.print("[ ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.print("]");
        System.out.println();
    }

    /**
     * 打印String数组
     *
     * @param arr
     */
    public static void printArr(String[] arr) {
        System.out.print("[ ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.print("]");
        System.out.println();
    }
}
